home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / iguana / bla2src / adlib.inc next >
Text File  |  1994-02-12  |  11KB  |  392 lines

  1. ;  ----------------------      ADLIB.INC      ----------------------
  2. ;  Adlib routines.
  3. ;  (C) 1994 JCAB/VangeliSTeam
  4.  
  5.  
  6.  
  7.  
  8. ; ===========================
  9. ; Data.
  10.  
  11. ADL_Instrument STRUC
  12.  
  13.         ADL_MFlMult     DB ?
  14.         ADL_CFlMult     DB ?
  15.         ADL_MKsrLoud    DB ?
  16.         ADL_CKsrLoud    DB ?
  17.         ADL_MAttDec     DB ?
  18.         ADL_CAttDec     DB ?
  19.         ADL_MSusRel     DB ?
  20.         ADL_CSusRel     DB ?
  21.         ADL_MWavef      DB ?
  22.         ADL_CWavef      DB ?
  23.         ADL_Mode        DB ?
  24.  
  25. ENDS                          
  26.  
  27. ADL_ChanData STRUC
  28.  
  29.         ADL_CVol        DB ?
  30.         ADL_MReg        DB ?
  31.         ADL_CReg        DB ?
  32.  
  33. ENDS
  34.  
  35. ADL_Channels    ADL_ChanData <0,00h,03h>
  36.                 ADL_ChanData <0,01h,04h>
  37.                 ADL_ChanData <0,02h,05h>
  38.                 ADL_ChanData <0,08h,0Bh>
  39.                 ADL_ChanData <0,09h,0Ch>
  40.                 ADL_ChanData <0,0Ah,0Dh>
  41.                 ADL_ChanData <0,10h,13h>
  42.                 ADL_ChanData <0,11h,14h>
  43.                 ADL_ChanData <0,12h,15h>
  44.  
  45. ADL_NoteTable DW 363, 385, 408, 432, 458, 485, 514, 544, 577, 611, 647, 686
  46.  
  47. ADL_Regs  DB 256 DUP(0)
  48. ADL_FRegs DB 256 DUP(0)
  49.  
  50. ADL_InsCount DW 0
  51.  
  52.  
  53.  
  54. ; ===========================
  55. ; Wait loop. CX IN's from DX
  56.  
  57. ADL_Loop:       MOV     DX,3C0h
  58.         @@lp:    IN      AL,DX
  59.                  LOOP    @@lp
  60. ;SetBorder 0,0,0
  61.                 RET
  62.  
  63. ; ===========================
  64. ; Write AdLib register. AL=reg, AH=val
  65.  
  66. ADL_SendReg:    MOV     BX,AX
  67.                 XOR     BH,BH
  68.                 MOV     ADL_FRegs[BX],AH
  69.                 MOV     DX,388h
  70.                 OUT     DX,AL
  71.                 MOV     CX,6
  72.                 CALL    ADL_Loop
  73. ;SetBorder 63, 63, 0
  74.                 MOV     DX,389h
  75.                 MOV     AL,AH
  76.                 OUT     DX,AL
  77.                 MOV     CX,35
  78.                 JMP     ADL_Loop
  79.  
  80. ; ===========================
  81. ; Reset routine.
  82.  
  83. ADL_Reset:      MOV     BX,1
  84.         @@lp:    MOV    AX,BX
  85.                  AND    AL,0E0h
  86.                  CMP    AL,40h
  87.                  JNZ    SHORT @@1
  88.                   MOV   AH,63
  89.         @@1:     MOV    AL,BL
  90.                  CALL   ADL_SendReg
  91.                  INC    BL
  92.                  JNZ    SHORT @@lp
  93.                 RET
  94.  
  95. ; ===========================
  96. ; Dumps an instrument to the card.
  97.  
  98. ADL_DumpInstrument:
  99.  
  100.                 ; ----------------------- MPU stuff below!!!
  101.  
  102.                 PUSH    AX
  103.                 ADD     AL,0C0h
  104.                 CALL    MPU_Send
  105.                 POP     AX
  106.                 PUSH    AX
  107.                 MOV     BL,AH
  108.                 XOR     BH,BH
  109.                 MOV     AL,MPU_Patches[BX]
  110.                 CALL    MPU_Send
  111.                 POP     AX
  112.  
  113.                 ; -----------------------
  114.  
  115.                 XOR     AH,AH
  116.                 PUSH    AX
  117.                 MOV     AH,SIZE ADL_ChanData
  118.                 MUL     AH
  119.                 MOV     DI,AX
  120.                 ADD     DI,OFFSET ADL_Channels
  121.                 POP     AX
  122.                 MOV     BX,AX
  123.                 MOV     AH,ADL_Mode[SI]
  124.                 MOV     ADL_Regs[BX+0C0h],AH
  125.                 MOV     AH,ADL_Regs[BX+0B0h]
  126.                 AND     AH,11011111b
  127.                 CALL    ADL_SendReg
  128.  
  129.                 MOV     AH,ADL_CKsrLoud[SI]
  130.                 NOT     AH
  131.                 AND     AH,63
  132.                 MOV     ADL_CVol[DI],AH
  133.  
  134.                 MOV     BL,ADL_MReg[DI]
  135.                 XOR     BH,BH
  136.                 ADD     BX,OFFSET ADL_Regs
  137.                 MOV     AH,ADL_MKsrLoud[SI]
  138.                 MOV     [BX+40h],AH
  139.                 MOV     AH,ADL_MFlMult[SI]
  140.                 MOV     [BX+20h],AH
  141.                 MOV     AH,ADL_MAttDec[SI]
  142.                 MOV     [BX+60h],AH
  143.                 MOV     AH,ADL_MSusRel[SI]
  144.                 MOV     [BX+80h],AH
  145.                 MOV     AH,ADL_MWavef[SI]
  146.                 MOV     [BX+0E0h],AH
  147.  
  148.                                         ; This is to make this more
  149.                 INC     SI              ; compressable. The offsets below
  150.                                         ; refer to the carrier, not the
  151.                                         ; modulator!!!
  152.                 
  153.                 MOV     BL,ADL_CReg[DI]
  154.                 XOR     BH,BH
  155.                 ADD     BX,OFFSET ADL_Regs
  156.                 MOV     AH,ADL_MKsrLoud[SI]
  157.                 AND     AH,11000000b
  158.                 OR      AH,00111111b
  159.                 AND     BYTE PTR [BX+40h],00111111b
  160.                 OR      [BX+40h],AH
  161.                 MOV     AH,ADL_MFlMult[SI]
  162.                 MOV     [BX+20h],AH
  163.                 MOV     AH,ADL_MAttDec[SI]
  164.                 MOV     [BX+60h],AH
  165.                 MOV     AH,ADL_MSusRel[SI]
  166.                 MOV     [BX+80h],AH
  167.                 MOV     AH,ADL_MWavef[SI]
  168.                 MOV     [BX+0E0h],AH
  169.                 RET
  170.  
  171. ; ===========================
  172. ; Initialize the instruments of the song.
  173.  
  174. ADL_StartSong:  MOV     SI,OFFSET CMF_Instruments
  175.                 MOV     CX,9
  176.         @@lp:    PUSH   CX
  177.                  PUSH   SI
  178.                  MOV    AL,CH
  179.                  MOV    AH,AL
  180.                  CALL   ADL_DumpInstrument
  181.                  POP    SI
  182.                  ADD    SI,SIZE ADL_Instrument
  183.                  POP    CX
  184.                  INC    CH
  185.                  DEC    CL
  186.                  JNZ    SHORT @@lp
  187.                 CALL    ADL_Dump
  188.                 RET
  189.  
  190. ; ===========================
  191. ; Dump the changed registers to the FM chip.
  192.  
  193. ADL_Dump:       MOV     SI,OFFSET ADL_Regs
  194.                 MOV     DI,OFFSET ADL_FRegs
  195.                 MOV     CX,256
  196.         @@dumpl: REPE CMPSB
  197.                  JCXZ   SHORT @@dumpe
  198.                  MOV    AH,[SI-1]
  199.                  MOV    AL,255
  200.                  SUB    AL,CL
  201.                  PUSH   CX
  202.                  CALL   ADL_SendReg
  203.                  POP    CX
  204.                  JMP    SHORT @@dumpl
  205.         @@dumpe:RET
  206.                 
  207. ; ===========================
  208. ; Execute a tick of the song.
  209.  
  210. ADL_DoSong:     PUSH    AX BX CX DX SI DI BP DS ES
  211.                 MOV     AX,CS
  212.                 MOV     DS,AX
  213.                 MOV     ES,AX
  214.  
  215. ;SetBorder 0, 0, 63
  216.  
  217.                 MOV     BP,OFFSET CMF_Offsets
  218.                 MOV     [ADL_InsCount],CMF_NInstruments
  219.  
  220.         @@otra:
  221. ;SetBorder 63, 0, 0
  222.                 DEC     WORD PTR CS:[BP]
  223.                 JNZ     @@Fin
  224.  
  225. ;SetBorder 0, 63, 0
  226.  
  227.                 MOV     SI,CS:[BP+2]
  228.         @@lp:    LODSB
  229.                  MOV    AH,AL
  230.                  AND    AH,0F0h
  231.                  CMP    AH,90h
  232.                  JC     SHORT @@kon
  233.                  JZ     @@koff
  234.                  CMP    AH,0D0h
  235.                  JZ     @@normd
  236.                  CMP    AH,0E0h
  237.                  JZ     @@longd
  238.  
  239.                  ; Song end.
  240.  
  241.                  MOV    SI,CS:[BP+4]
  242.                  JMP    SHORT @@lp
  243.  
  244.         @@kon:   SHR    AH,4
  245. ;SetBorder 0, 0, 63
  246.  
  247.                  PUSH   AX
  248.                  MOV    AL,AH
  249.                  ADD    AL,0B0h
  250.                  XOR    AH,AH
  251.                  CALL   ADL_SendReg
  252.                  POP    AX
  253.                  AND    AL,15
  254. ;SetBorder 0, 63, 0
  255.                  JZ     SHORT @@yains
  256.                   PUSH  AX
  257.                   PUSH  SI
  258.                   DEC   AL
  259.                   MOV   BH,AH
  260.                   PUSH  AX
  261.                   MOV   AH,SIZE ADL_Instrument
  262.                   MUL   AH
  263.                   MOV   SI,AX
  264.                   ADD   SI,OFFSET CMF_Instruments
  265.                   MOV   AL,BH
  266.                   POP   BX
  267.                   MOV   AH,BL
  268.                   CALL  ADL_DumpInstrument
  269.                   POP   SI
  270.                   POP   AX
  271.         @@yains: LODSB
  272.                  PUSH   AX
  273.                  AND    AL,7Fh
  274.                  SUB    AL,13
  275.                  XOR    AH,AH
  276.                  MOV    BL,12
  277.                  DIV    BL
  278.                  MOV    BL,AH
  279.                  XOR    BH,BH
  280.                  ADD    BX,BX
  281.                  MOV    DX,ADL_NoteTable[BX]
  282.                  ADD    AL,AL
  283.                  ADD    AL,AL
  284.                  OR     DH,AL
  285.                  OR     DH,00100000b
  286.                  POP    AX
  287.                  PUSH   AX
  288.                  MOV    BL,AH
  289.                  XOR    BH,BH
  290.                  MOV    ADL_Regs[BX+0A0h],DL
  291.                  MOV    ADL_Regs[BX+0B0h],DH
  292.                  ADD    AL,AL
  293.                  JNC    SHORT @@novol
  294.                   PUSH  AX
  295.                   MOV   AL,SIZE ADL_Channels
  296.                   MUL   AH
  297.                   MOV   DI,AX
  298.                   ADD   DI,OFFSET ADL_Channels
  299.                   LODSB
  300.                   MUL   ADL_CVol[DI]
  301.                   XOR   AH,3Fh
  302.                   XOR   BH,BH
  303.                   MOV   BL,ADL_CReg[DI]
  304.                   AND   ADL_Regs[BX+40h],11000000b
  305.                   OR    ADL_Regs[BX+40h],AH
  306.                   POP   AX
  307.         @@novol:
  308.  
  309.                  ; ----------------------- MPU stuff below!!!
  310. ;SetBorder 63, 0, 0
  311.  
  312.                  POP    AX
  313.                  PUSH   AX
  314.  
  315.                  MOV    BL,AH
  316.                  XOR    BH,BH
  317.                  ADD    BX,OFFSET MPU_Notes
  318.                  MOV    AL,[BX]
  319.                  AND    AL,AL
  320.                  JZ     @@nooff
  321.  
  322.                  POP    AX
  323.                  PUSH   AX
  324.                  MOV    AL,AH
  325.                  ADD    AL,80h
  326.                  CALL   MPU_Send
  327.                  POP    AX
  328.                  PUSH   AX
  329.                  MOV    AL,[BX]
  330.                  CALL   MPU_Send
  331.                  MOV    AL,7Fh
  332.                  CALL   MPU_Send
  333.         @@nooff:
  334.                  POP    AX
  335.                  PUSH   AX
  336.                  MOV    AL,AH
  337.                  ADD    AL,90h
  338.                  CALL   MPU_Send
  339.                  POP    AX
  340.                  AND    AL,7Fh
  341.                  MOV    [BX],AL
  342.                  CALL   MPU_Send
  343.                  MOV    AL,7Fh
  344.                  CALL   MPU_Send
  345.         @@nompu:
  346.  
  347.                  ; -----------------------
  348.  
  349. ;SetBorder 0, 0, 0
  350.                  JMP    @@lp
  351.  
  352.         @@koff:  AND    AL,15
  353.                  XOR    AH,AH
  354.                  MOV    BX,AX
  355.                  AND    ADL_Regs[BX+0B0h],11011111b
  356.                  JMP    @@lp
  357.  
  358.         @@longd: AND    AL,15
  359.                  MOV    AH,AL
  360.                  LODSB
  361.                  INC    AX
  362.                  MOV    DX,5
  363.                  MUL    DX
  364.                  MOV    CS:[BP],AX
  365.                  JMP    SHORT @@finish
  366.  
  367.         @@normd: AND    AL,15
  368.                  INC    AX
  369.                  MOV    AH,5
  370.                  MUL    AH
  371.                  MOV    CS:[BP],AX
  372.  
  373.         @@finish:
  374. ;SetBorder 0, 0, 0
  375.                 MOV     CS:[BP+2],SI
  376.  
  377.         @@Fin:
  378.                 ADD     BP,6
  379.                 DEC     [ADL_InsCount]
  380.                 JNZ     @@otra
  381.  
  382.                 CALL    ADL_Dump
  383.                 
  384. ;SetBorder 0, 0, 0
  385.                 POP     ES DS BP DI SI DX CX BX AX
  386.                 RET
  387.  
  388.  
  389.  
  390.  
  391. ;  ----------------------   End of ADLIB.INC  ----------------------
  392.